#ifndef USR_TYPEDEF_H
#define USR_TYPEDEF_H

#include <stdint.h>
#include <sys/types.h>    
#include <sys/stat.h>
#include "usr_cfg.h"

enum state{OFF, ON};
enum chx_mode{SAFE, IEPE, AC, DC, TIB, CAL};
enum spd_mode{CLOSE, PHOTO, MAGN, PLUSE};
enum spd_calc{DIRECT, FREQ, MVAVG, YMVCUT};
enum win_func{RECT, HANN, HAMM};
enum fir_cutoff{LPFNO = 0, LPF10K = 10, LPF15K = 15, LPF20K = 20, LPF30K = 30, LPF40K = 40};
enum sensor_det{REMOVED, INSERTED};					// 1为INSERTED
enum a24v_det{A24V_ERROR, A24V_NORMAL};				// 1为NORMAL
enum pga_det{EF_NORMAL, EF_ERROR};					// 1为ERROR
enum run_status{GOOD, WARNING, ALARM};
enum socket_type{TCP, UDP};
enum trigger{INTER, EXTER, BDS};
enum disk_type{SD, EMMC, HDD1, HDD2};
enum baud_rate{B4800BPS = 4800, B9600BPS = 9600, B19200BPS = 19200, B38400BPS = 38400, B57600BPS = 57600, B115200BPS = 115200};
enum data_bits{DATA_7BITS = 7, DATA_8BITS};
enum parity_bit{NONE, ODD, EVEN};
enum stop_bit{STOP_1BIT = 1, STOP_2BIT};

/*******************************************************************************
 * Local type definitions ('typedef')
 ******************************************************************************/

typedef struct sys_runtime_t {						//定义实时数据信息
	double					sys_chk_time;
	float					sys_amb_temp;			//系统环境温度
	float					sys_ps_temp;			//zynqmp ps温度
	float					sys_pl_temp;			//zynqmp pl温度
	volatile uint8_t		disk_chk_flag;			//磁盘空间检查，1表示空间不足
	volatile uint8_t 		net_chk_flag;			//0表示网络断开，1表示网络联通
	char					*json_cfg_file_recv;	//接收的配置文件指针
	char					*json_resv_file_recv;	//接收的预留文件指针
	char 					vdata_file_path[VDATA_FILE_PATH_LEN];//振动数据保存位置以及名字
	struct stat 			fstate;					//一个系统文件系统中的文件属性结构				
}sys_runtime;	


typedef struct td_calc_norl_t {
	float					td_mean;				//均值
	float					td_abs_mean;			//绝对平均值
	//float					td_vari;				//方差
	//float					td_std_devi;			//标准差
	float					td_sqr_root;			//方根幅值
	float 					td_rms;					//均方根值（有效值）
	//float 					td_max;					//最大值
	//float 					td_min;					//最小值
	float 					td_peak;				//峰值
	float 					td_ppeak;				//峰峰值
	float					td_wave_factor;			//波形指标
	float					td_crest_factor;		//峰值指标
	float					td_pulse_factor;		//脉冲指标
	float					td_margin_factor;		//裕度指标
	float					td_skewness;			//偏斜度
	float 					td_kurtosis;			//峭度	
	float					td_peakvue_max;			//冲击最大值
	float					td_peakvue_min;			//冲击最小值
	float					td_peak_vel;			//速度最大值
	float					td_rms_vel;				//速度有效值
}td_calc_norl;				//字节对齐共64byte



typedef struct acc_unit_t {	
	float 					*td_vdata_raw_volt;
	float 					*td_vdata_raw_g;
	td_calc_norl			td_eigen_value;
}acc_unit;


typedef struct spd_unit_t {
	uint8_t 				*speed_pulse_raw;
	float	 				speed_val;
	float					speed_coeff;
}spd_unit;


typedef struct sys_cfg_info_t {	
	char					json_cfg_ver[16];					//配置文件版本
	char					json_cfg_name[16];					//配置文件名称
	
	char					rootfs_ver[16];						//根文件系统版本

	char					hardware_ver[16];					//硬件版本
	char					hardware_name[16];					//硬件名称
	
	enum state				debug;								//是否打开调试信息运行

	char 					manufacturer[16];					//制造商名字

	char					dev_name[16];						//设备型号(固定16字节字符串)
	char 					dev_type[10];						//设备类型(固定10字节字符串)
	char 					dev_sn[16];							//设备串行码(固定16字节字符串)
	char 					dev_uuid[25];						//设备UUID号(zynq 57bit zynqmp 96bit)
	char					dev_local[16];						//设备安装地点(固定16字节字符串)

	char					fw_version[8];						//固件版本(1.00.00)
	char					fw_date[16];						//固件日期(23.09.11-11:40)

	enum trigger			trigger;							//触发方式(内部触发或外部触发)
	uint32_t 				samp_freq;							//ADC真实采样率
	uint32_t 				duration;							//采样长度(单位秒)
	enum state				eigen_calc;							//特征值计算

	enum state				impact_en;							//冲击解调使能
	uint8_t 				impact_map;							//冲击解调映射转速通道(固定1字节整型)(此设备只能是0或1)

	enum state				order_en;							//阶比跟踪使能
	uint8_t 				order_map;							//阶比跟踪映射转速通道(固定1字节整型)(此设备只能是0或1)
	uint16_t 				order_spd_thrd;						//阶比跟踪转速阈值(固定2字节整型)
	
	uint16_t				man_thd_slp;						//主线程间隔，同时是磁盘状态间隔(固定2字节整型)
	uint16_t				daq_thd_slp;						//线程间隔，同时是数据采集间隔(固定2字节整型)
	
	enum socket_type 		socket_type;						//通信类型(TCP或UDP)(固定4字节字符串)
	uint16_t 				socket_port;						//TCP或UDP端口号(固定2字节整型)

	char					disk_path[30];						//数据存储位置(固定字符串数组)
	enum state				disk_data_save;						//使能数据保存(固定4字节字符串)
	uint32_t				disk_data_save_inv;					//数据保存间隔(单位秒)
	float 					disk_free_size;						//磁盘剩余容量MB(固定2字节整型)
	float					disk_warn_thrd;						//磁盘预警阈值
	float					disk_alarm_thrd;					//磁盘报警阈值
	uint16_t				disk_chk_inv;						//磁盘检测间隔(秒)(固定2字节整型)

	char					app_path[100];						//应用程序位置(固定字符串数组)
	char					json_cfg_path[100];					//配置文件位置(固定字符串数组)
	uint32_t				zynqmp_uuid[3];						//zynqmp UUID 16进制
}sys_cfg_info;


typedef struct sensor_info_t {
	char					manufacturer[16];					//传感器制造商(固定16字节字符串)
	char					modle[16];							//传感器型号
	char					sn[16];								//传感器串行码
	char					type[5];							//传感器类型ACC,VEL,DISP,VOL,CUR等
	char 					unit[4];							//传感器单位
	char 					range[6];							//传感器范围
}sensor_info;


typedef struct chx_cfg_info_t {
	enum state				chx_en;								//ON 通道使能 OFF 通道关闭
	char					chx_desc[16];						//8通道测点名称(固定16字节字符串)
	sensor_info				chx_sensor;							//通道传感器结构体
	uint32_t				chx_sample_freq;					//通道采样率
	enum chx_mode			chx_mode;							//加速度通道工作模式
	float 					chx_pga_gain;						//通道PGA增益
	float 					chx_drcc_gain;						//通道DRCC增益
	enum fir_cutoff			chx_fir_cutoff;						//FIR滤波器截止频率
	float					chx_sens;							//通道传感器灵敏度
	enum win_func 			chx_win_func;						//窗函数(RECT 矩形窗 HANN 汉宁窗          HAMM 海明窗)
	float					chx_offset;							//通道偏移值(有些传感器计算需要偏移)
	float					chx_warning;						//预警值(用户自定义)
	float					chx_alarm;							//报警值(用户自定义)
	enum sensor_det			chx_plug_det;						//IEPE模式传感器插拔状态指示
	enum a24v_det			chx_pwr_a24v;						//A24V供电监测
	enum pga_det			chx_pga_ef;							//PGA溢出监测
	enum run_status 		chx_status;							//通道运行状态评估
	float					chx_calib;							//通道交流校准值(从外部EEPROM获取出厂校准数据)
}chx_cfg_info;


typedef struct spd_cfg_info_t {
	enum state				spd_en;								//ON 通道使能 OFF 通道关闭
	char					spd_desc[16];						//速度通道测点名称(固定16字节字符串)
	sensor_info				spd_sensor;							//通道传感器结构体
	enum spd_mode			spd_mode;							//速度通道工作模式
	enum spd_calc			spd_calc;							//速度通道计算方式
	enum a24v_det			spd_a24v;							//A24V供电监测
	float	 				spd_pulse;							//转速周脉冲数
	float 					spd_save_thrd;						//数据保存阈值(固定2字节整型, 低于阈值加速度等所有数据不保存)
}spd_cfg_info;


typedef struct uart_cfg_info_t {
	char 					com[8];								//uart端口(固定,由设备树绑定)
	enum baud_rate 			baudrate;							//uart波特率
	enum data_bits			bits;								//uart数据位数
	enum parity_bit			parity;								//uart校验位
	enum stop_bit 			stop;								//uart停止位
}uart_cfg_info;


typedef struct rs485_cfg_info_t {
	enum state				rs485_en;							//ON 通道使能 OFF 通道关闭
	char 					rs485_mode[8];						//此设备只能是server
	enum state				rs485_modbus_en;					//modbus总线协议使能(ON, OFF)
	uint8_t					rs485_dev_id;						//设备ID （1到247）
	uart_cfg_info			rs485_uart_cfg;						//使用的uart端口信息
}rs485_cfg_info;

/*
typedef struct bds_cfg_info_t {
	enum state				bds_en;								//ON 通道使能 OFF 通道关闭
	char					bds_manufacturer[16];				//传感器制造商(固定16字节字符串)
	char					bds_modle[16];						//传感器型号
	char					bds_sn[16];							//传感器串行码
	char					bds_type[16];						//传感器类型
	char 					bds_unit[8];						//传感器单位
	char 					bds_desc[16];						//bds通道测点名称(固定16字节字符串)
	uint32_t				bds_rate;							//更新速率
	char 					bds_protocol[16];					//bds协议
	uart_cfg_info			bds_uart_cfg; 						//使用的uart端口信息
	enum state 				bds_led_flag;						//bds led状态
}bds_cfg_info;
*/

typedef struct spi_config_t
{
	int fd;
	
    int spi_mode;      // [0-3]  (-1 when not configured).
    int lsb_first;     // {0,1}  (-1 when not configured).
    int bits_per_word; // [7...] (-1 when not configured).
    int spi_speed;     // 0 when not configured.
    int spi_ready;     // {0,1}  (-1 when not configured).
} spi_cfg_info;


typedef struct afe_dev_t afe_dev_info;
struct afe_dev_t
{
	enum state		debug;
    spi_cfg_info 	*spi;
    int (*send)(afe_dev_info *dev, const char cmd_code[], char ret_code[]);
};

typedef struct data_frame_len_t
{
	uint32_t 		file_info_len;
	uint32_t 		file_info_code;
	uint32_t 		chx_head_len;
	uint32_t 		chx_head_code;
	uint32_t 		eigen_data_len;
	uint32_t 		eigen_data_code;
	uint32_t 		raw_data_len;
	uint32_t 		raw_data_code;
	uint32_t 		resv_data_len;
	uint32_t 		resv_data_code;
} data_frame_len_info;


typedef struct json_cfg_file_info_t
{
	uint32_t 		cfg_data_offset;
	uint32_t 		cfg_data_len;
	const char 		*cfg_rsv_string;
	const char		*cfg_data_string;
	uint8_t			cfg_data_sha256[32];
} json_cfg_file_info;



extern sys_cfg_info			sys_cfg;
extern chx_cfg_info			chx_cfg[ACC_CH_TOTAL];
extern spd_cfg_info			spd_cfg[SPD_CH_TOTAL];
extern rs485_cfg_info		rs485_cfg;


extern sys_runtime			sys_rt;	
extern acc_unit				acc_rt[ACC_CH_TOTAL];
extern spd_unit				spd_rt[SPD_CH_TOTAL];


#endif

